// 子集
// 迭代 位运算 时间复杂度 O(n * 2**n)
// var subsets = function (nums) {
//   const ans = []
//   const n = nums.length

//   for (let mask = 0; mask < 2 ** n; mask++) {
//     const t = []
//     for (let i = 0; i < n; i++) {
//       if (mask & (2 ** i)) {
//         t.push(nums[i])
//       }
//     }
//     ans.push(t)
//   }
//   return ans
// }
// // 方法 2 递归
// const dfs = (cur, nums, t, ans) => {
//   if (cur === nums.length) {
//     ans.push(t)
//     return
//   }
//   dfs(cur + 1, nums, [...t, nums[cur]], ans)
//   dfs(cur + 1, nums, t, ans)
// }
// var subsets = function (nums) {
//   const ans = []
//   dfs(0, nums, [], ans)
//   return ans
// }
// 方法 3 迭代
var subsets = function (nums) {
  let ans = [[]]
  for (let num of nums) {
    let newsets = []
    for (let subset of ans) {
      let newsubset = [...subset, num]
      newsets.push(newsubset)
    }
    ans = [...ans, ...newsets]
  }
  return ans
}

let r = subsets([1, 2, 3, 4])

console.log(r)
